package org.rslai.autotest.core.driver;

import java.net.MalformedURLException;

import org.openqa.selenium.WebDriver;
import org.rslai.autotest.core.page.Frame;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;

public abstract class AbstractDriver implements IDriver {
	@Autowired
	Frame frame;

	@Value("${driver.singleDriver}")
	protected boolean isSingleDriver; // 是否启动一次浏览器
	protected boolean isRun = false; // 在启动一次浏览器的情况下，浏览器是否已启动

	@Value("${driver.remoteWebDriver.address}")
	protected String remoteAddress; // 运行测试脚本的客户机地址

	@Value("${driver.timeout.implicitlyWait}")
	protected int implicitlyWait; // 元素查找默认超时时间

	@Value("${driver.window.maximize}")
	protected boolean maximize; // 是否将浏览器最大化

	protected WebDriver driver;

	public void initDriver() throws MalformedURLException  {
		if (isSingleDriver){
			if (!isRun) {
				startDriver();
				setStopAtShutdown();
				isRun = true;
			}
		} else {
			startDriver();
		}

		this.frame.initCurrentFrame(); // 每次开始一个测试，初始化当前 Frame
	}

	public WebDriver getDriver() {
		return driver;
	}

	public void quitDriver() {
		if (!isSingleDriver){
			stopDriver();
		}
	}

	/**
	 * 创建新的 WebDriver
	 * @throws MalformedURLException
	 */
	abstract protected void startDriver() throws MalformedURLException;

	/**
	 * 销毁 WebDriver
	 */
	private void stopDriver() {
		driver.quit();
	}

	/**
	 * 注册在JVM退出时关闭Selenium的钩子。
	 */
	private void setStopAtShutdown() {
		Runtime.getRuntime().addShutdownHook(new Thread("Selenium Quit Hook") {
			@Override
			public void run() {
				stopDriver();
			}
		});
	}

}
